#ifndef HEX_DUMP_HPP
#define HEX_DUMP_HPP

#include <iostream>
#include <string>

namespace zj {

class HexDump {
public:
    // 以十六进制格式打印二进制数据
    static void dump(const std::string& data, std::ostream& os = std::cout) {
        os << "Data size: " << data.size() << " bytes\n";
        os << "Hex dump:\n";
        
        const unsigned char* bytes = reinterpret_cast<const unsigned char*>(data.c_str());
        
        for (size_t i = 0; i < data.size(); i += 16) {
            // 打印偏移量
            os << std::setw(8) << std::setfill('0') << std::hex << i << ": ";
            
            // 打印十六进制值
            for (size_t j = 0; j < 16; j++) {
                if (i + j < data.size()) {
                    os << std::setw(2) << std::setfill('0') << std::hex << static_cast<int>(bytes[i + j]) << " ";
                } else {
                    os << "   ";
                }
            }
            
            // 打印ASCII值
            os << " | ";
            for (size_t j = 0; j < 16; j++) {
                if (i + j < data.size()) {
                    if (bytes[i + j] >= 32 && bytes[i + j] <= 126) {
                        os << static_cast<char>(bytes[i + j]);
                    } else {
                        os << '.';
                    }
                } else {
                    os << ' ';
                }
            }
            
            os << '\n';
        }
        os << std::dec; // 恢复为十进制输出
    }
    
    // 检查字符串是否包含非打印字符
    static bool containsNonPrintable(const std::string& data) {
        for (char c : data) {
            if (c < 32 && c != '\t' && c != '\n' && c != '\r') {
                return true;
            }
            if (c >= 127) {
                return true;
            }
        }
        return false;
    }
};

} // namespace zj

#endif // HEX_DUMP_HPP